# encoding=utf-8
import sys
import time
import traceback

from pymongo.errors import BulkWriteError
import copy

sys.path.append('..')
sys.path.append('../..')
sys.path.append('../../..')
from common_parser_lib.mongo import MongDb

reload(sys)
sys.setdefaultencoding('utf8')
mongo_conf37 = {
    'host': '101.201.102.37',
    'port': 28019,
    'final_db': 'final_data',
    'username': None,
    'password': None,
}

mongo_conf = {
    'host': '172.16.215.1',
    'port': 40042,
    'final_db': 'final_data',
    'username': "readme",
    'password': "readme",
}
class change_update_all:
    def __init__(self):

        self.f = open("business_status_not_change_id.txt", "w")
        self.db37 = MongDb(mongo_conf37['host'], mongo_conf37['port'], mongo_conf37['final_db'],
                           mongo_conf37['username'],
                           mongo_conf37['password'])
        self.db = MongDb(mongo_conf['host'], mongo_conf['port'], mongo_conf['final_db'],
                         mongo_conf['username'],
                         mongo_conf['password'])

        self.sourceTable = 'enterprise_data_gov'
        self.targetTable = 'enterprise_data_gov2'
        self.business_status_map = {
            u"存续": u"存续", u"存续（在营、开业、在册）": u"存续",
            u"吊销，未注销": u"吊销", u"在营（开业）企业": u"在业", u"存活": u"存续", u"该企业已登记成立": u"在业", u"开业": u"存续", u"吊销": u"吊销",
            u"在业": u"在业",
            u"注销": u"注销", u"已注销": u"注销", u"登记成立": u"在业", u"吊销企业": u"吊销", u"该企业已注销": u"注销", u"该企业已吊销": u"吊销",
            u"在营（开业）": u"在业",
            u"确立": u"在业", u"已核准名称": u"在业", u"营业": u"在业", u"内资存活": u"存活", u"已登记": u"在业", u"存续(在营、开业、在册)": u"存续",
            u"已变更": u"迁出",
            u"吊销未注销": u"吊销", u"内资注销": u"注销", u"迁出": u"迁出", u"已成立": u"在业", u"注销企业": u"注销", u"变更": u"迁出", u"内资吊销": u"吊销",
            u"非正常户": u"吊销",
            u"已开业": u"在业", u"已吊销": u"吊销", u"在册": u"存续", u"存在": u"存续", u"异地迁入": u"迁入", u"新增": u"迁入", u"开业/正常经营": u"在业",
            u"正常": u"存续",
            u"变更登记中": u"迁出", u"其他": u"其他", u"外资存活": u"存续", u"证照管理登记中": u"在业", u"该企业已停业（个体工商户使用": u"停业", u"清算中": u"清算",
            u"注吊销": u"注销", u"迁移异地": u"迁出", u"被吊销未办理注销": u"吊销", u"吊销，已注销": u"注销", u"停业": u"停业", u"吊销并注销": u"注销",
            u"外资注销": u"注销", u"该企业已迁移异地": u"迁出", u"设立登记中": u"在业", u"待迁入": u"迁入", u"备案登记中": u"在业", u"资料修改": u"迁出",
            u"歇业": u"停业",
            u"已迁出企业": u"迁出", u"存续(经营正常)": u"存续", u"个体转企业": u"在业", u"市外迁出": u"迁出", u"清算": u"清算", u"该企业已撤销登记": u"撤销",
            u"系统内迁入中": u"迁入",
            u"正常在业": u"在业", u"吊销,未注销": u"吊销", u"注销登记中": u"注销", u"迁移": u"迁出", u"撤销": u"撤销", u"名称变更预先核准中": u"在业",
            u"年检中": u"在业", u"迁往外省市": u"迁出",
            u"筹建": u"筹建", u"迁出登记中": u"迁出", u"准迁": u"迁入", u"已转企": u"在业", u"被吊销办理注销": u"注销", u"吊销,已注销": u"注销",
            u"简易注销": u"注销", u"拟注销": u"注销",
            u"被吊销": u"吊销", u"迁入意见中": u"迁入", u"开业经营异常": u"开业", u"注销 （注销日期2001年5月30日）": u"注销", u"条线变更": u"开业",
            u"名称预核": u"开业", u"已撤销登记": u"撤销", u"已迁出": u"迁出",
            u"注销 （注销日期2001年5月25日）": u"注销", u"删除统一码业务中": u"注销", u"撤销登记": u"撤销", u"注销 （注销日期2002年9月26日）": u"注销",
            u"注销 （注销日期2013年4月3日）": u"注销", u"注销 （注销日期2015年7月23日）": u"注销",
            u"迁往市外": u"迁出", u"企业改制更新中": u"在业", u"已撤销企业": u"撤销", u"撤消登记": u"撤消", u"撤销企业": u"撤消", u"条线变出": u"开业",
            u"注销 （注销日期2002年8月26日）": u"注销", u"注销 （注销日期2002年9月18日）": u"注销",
            u"注销 （注销日期2013年6月14日）": u"注销", u"注销 （注销日期2013年8月6日）": u"注销", u"注销 （注销日期2015年8月31日）": u"注销",
            u"注销 （注销日期2016年2月26日）": u"注销", u"被撤销": u"撤销", u"吊销已注销": u"注销"
        }

    def update(self):
        result = self.db.select(self.sourceTable, {})
        lst = []
        i = 0
        num = 0
        begin_time = time.time()
        no_change_list = []
        for item in result:
            model = copy.deepcopy(item)
            num += 1
            try:
                id = item.get("_id")
                if item.has_key("business_status"):
                    business_status = item["business_status"]
                    business_status = unicode(business_status)
                    if business_status not in self.business_status_map.keys():
                        no_change_list.append((id, business_status))
                    else:
                        model["business_status"] = self.business_status_map[business_status]

                lst.append(model)

                if len(lst) >= 500:
                    self._insert_info_batch(self.targetTable, lst, is_order=False)
                    del lst[:]
                    self.writefile(no_change_list)
                    del no_change_list[:]
                if num % 500 == 0:
                    print num, "time_cost:", time.time() - begin_time
            except Exception:
                print traceback.format_exc()

            finally:
                if len(lst) >= 500:
                    self._insert_info_batch(self.targetTable, lst, is_order=False)
                    del lst[:]
                    self.writefile(no_change_list)
                    del no_change_list[:]

        self._insert_info_batch(self.targetTable, lst, is_order=False)
        del lst[:]
        self.writefile(no_change_list)
        del no_change_list[:]

    def writefile(self, data_list):
        for item in data_list:
            self.f.write(str(item[0]))
            self.f.write('\t')
            self.f.write(item[1])
            self.f.write('\n')

    def _insert_info_batch(self, table, lst, is_order=True, insert=True):
        if lst != None and len(lst) == 0: return
        dbtemp = self.db37.db[table]
        bulk = dbtemp.initialize_ordered_bulk_op() if is_order else dbtemp.initialize_unordered_bulk_op()
        for item in lst:
            # print item
            if insert:
                bulk.insert(item)
            else:
                _id = item.pop('_id')
                bulk.find({'_id': _id}).update({'$set': item})
        try:
            bulk.execute({'w': 0})
            print ('insert_logs:' + str(len(lst)))
            # logging.info('insert_logs:' + str(len(lst)))
        except BulkWriteError as bwe:
            pass
            # logging.info(bwe.details)


if __name__ == '__main__':
    changeModel = change_update_all()
    changeModel.update()
